// 权限拦截在路由跳转  导航守卫
// 导航守卫可以控制路由的访问权限
import router from './router'
// 不需要导出，因为只需要让代码执行即可
import store from '@/store'// 引入store实例，和组件中的this.$store是一回事
import nprogress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// import user from './store/modules/user'
// 前置守卫
// 调用路由实例对象的 beforeEach方法，即可声明“全局前置守卫"
// 每次发生路由导航跳转的时候，都会自动触发回调函数
const whiteList = ['/login', '/404'] // 定义白名单  所有不受权限控制的页面
router.beforeEach(async(to, from, next) => {
  // to 是将要访问的路由的信息对象
  // from是将要离开的路由的信息对象
  // next是一个函数，调用next()表示放行，允许这次路由导航 next()必须执行
  // 当前用户拥有后台主页的访问权限，直接放行：next()
  // 当前用户没有后台主页的访问权限，可强制其跳转到登录页面/白名单页面(不需要token就能访问的其他页面)：next(地址)
  // 当前用户没有后台主页的访问权限，不允许跳转到后台主页：next(false)
  nprogress.start()// 开启进度条
  if (store.getters.token) {
  // 有token
  // 只有有token的情况下才能获取资料
    if (to.path === '/login') {
      // 有token时访问登录页，强制跳转到主页
      next('/')
    } else {
      // 有token时访问其他页 直接放行
      // 有token的位置去获取用户资料
      // 如果当前vuex中有用户id,表明已经有了资料，不需要获取了，若没有id,才会获取id
      if (!store.getters.userId) {
        // 没有id ,才获取用户资料
        await store.dispatch('user/getUserInfo')
        // 异步操作 如果后续需要根据用户资料获取数据的话，必须改成同步
        // 异步的话，你没获取用户资料，就先执行next()跳转到其他页面
        // 改成同步，则必须先获取用户资料，才能执行next()
      }
      next()
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) > -1) {
      // 没token时访问登陆页面 或者白名单页面时 放行
      next()
    } else {
      // 没有token 访问需要权限页面 禁止 强制跳转到登录页
      next('/login')
    }
  }
  nprogress.done() // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
})
// 后置守卫
router.afterEach(() => {
  nprogress.done() // 关闭进度条
})
